package com.cskaoyan.javase.oop2._2polymorphic._2advantage.instanceofs;

/**
 * instanceof关键字
 * 它的使用语法:
 *      引用/对象名 instanceof 类名
 * 上述语法结构,用来判断:
 *      引用所指向的对象,是否是后面类名的对象或者子类对象
 *      如果是,就返回布尔值true
 *      如果不是,就返回false
 *      当引用指向null时，使用该语法，结果会直接返回false。
 *      该语法结构通常都是配合if进行使用的
 *
 * 这个语法结构,和向下转型,有什么关系呢?
 *      如果上述结构返回true,说明引用指向的对象就是类名的对象,或者它的子类对象
 *      这时,如果引用是一个父类引用,那么这个父类引用就可以强转成"类名"的数据类型
 *
 * 引用数据类型的强制类型转换,向下转型一旦出错,就会导致程序报错终止,抛出异常
 * 所以向下转型是非常危险的
 * 使用向下转型,除非是确定一定出现问题,否则都一定要用instanceof判断之后再强转.
 *
 * @since 10:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Father f = new Grandson();
        if (f instanceof Grandson) {
            // true 表示f指向的对象就是Grandson的对象或者子类对象, 所以可以强转
            Grandson gs = (Grandson) f;
        }
        if (f instanceof Son) {
            // true 因为f引用指向的对象是Son的子类对象
            Son s = (Son) f;
        }
    }
}

class Father {
}

class Son extends Father {
}

class Grandson extends Son {
}